import { isString, isBoolean, isFunction } from "./index";

/**
 * 解析 hidden 参数的几种场景：
 * 1. Boolean：直接返回布尔值
 * 2. Function：调用函数传入 { scope }
 * 3. 字符串：以 ":" 开头返回 data[prop]，以 "@" 开头返回 !scope[prop]
 *
 * @param {string} method 方法名称，目前支持 "hidden"
 * @param {Object} options 选项对象
 * @param {*} options.value 输入值
 * @param {Object} options.scope 作用域对象
 * @param {Object} [options.data={}] 附加数据对象
 * @returns {boolean|*} 解析后的结果
 */
export default function (method, { value, scope, data = {} }) {
	if (method === "hidden") {
		if (isBoolean(value)) {
			return value;
		} else if (isString(value)) {
			const prop = value.substring(1);
			switch (value[0]) {
				case "@":
					return !scope[prop];
				case ":":
					return data[prop];
				default:
					return false;
			}
		} else if (isFunction(value)) {
			return value({ scope, ...data });
		}
		return false;
	}
}